home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / UTILITY / LINKINIT.M < prev    next >
Encoding:
Text File  |  1993-12-10  |  4.8 KB  |  159 lines

  1. MODULE LinkInit;
  2.  
  3. (*
  4.  * Konfigurationsmodul, das den Linker als gelinktes Programm lauffähig macht,
  5.  * wenn der Speicherplatz unter der Shell nicht ausreicht.
  6.  *
  7.  * Vorbereitung
  8.  * ------------
  9.  *
  10.  * Zuerst müssen die 'set'-Aufrufe angepaßt werden auf die Pfade, wie
  11.  * sie auf dem Zielsystem verwendet werden, ebenso müssen die 'link'-Aufrufe
  12.  * ggf. geändert werden.
  13.  *
  14.  * In der Shell kann unter 'Linker-Opionen' die vollst. Optimierung gewählt
  15.  * werden. Zudem müssen zum Einbinden die Module
  16.  *   M2Init,
  17.  *   SimpleError.IMP,
  18.  *   ShellMsg.IMP und
  19.  *   LinkInit        (dieses Modul)
  20.  * in den Linker-Parametern aktiviert werden.
  21.  *
  22.  * Dann kann der Linker (MM2LINK.MOD) gelinkt werden.
  23.  *
  24.  * ACHTUNG: Da hier auch die Treibermodule fest bestimmt werden,
  25.  *    sind ggf. mehrere gelinkte Versionen des Linkers zu erstellen,
  26.  *    die verschiedene benötigte Treiber einbinden!
  27.  *
  28.  * Anwendung
  29.  * ---------
  30.  * Beim Aufruf kann dem Linker in der Command-Line der Name des
  31.  * zu linkenden Hauptmoduls übergeben werden. Ist keiner abgegeben,
  32.  * fragt der Linker selbst danach.
  33.  * Optional kann entweder "-H" für teilweise oder "-F" als vollst.
  34.  * Optimierung mit als Argument angegeben werden.
  35.  * "-M" als Option geht auch - dann werden nur die Prozedurnamen
  36.  * aus dem Programm entfernt.
  37.  * Mit "-O" und einem darauf folgenden Namen kann ein anderer Ausgabe-
  38.  * Name bestimmt werden.
  39.  *
  40.  * Beispiel:
  41.  *   MM2LINK MM2SHELL.MOD -M
  42.  * linkt die Shell und entfernt dabei die Prozedurnamen (bei einem
  43.  * Laufzeitfehler in einem Shell-Modul kann dann nur der Modulname
  44.  * angezeigt werden).
  45.  *
  46.  * Steht keine Command-Shell zur Verfügung, ist es am Praktischsten,
  47.  * den Linker als Anwendung im GEM-Desktop anzumelden für die Endung
  48.  * "MOD". Ein Doppelklick im GEM-Desktop auf ein übersetztes Modul
  49.  * aktiviert dann den Linker und er erzeugt das Programm dort, woher
  50.  * das Modul stammt.
  51.  *)
  52.  
  53. FROM SYSTEM IMPORT ADDRESS, ADR;
  54.  
  55. FROM ShellMsg IMPORT DefPaths, ImpPaths, ModPaths, SrcPaths, LinkerParm,
  56.         LinkMode, LLRange;
  57.  
  58. FROM ErrBase IMPORT RaiseError, ErrResp, RtnCond;
  59.  
  60. FROM PrgCtrl IMPORT GetBasePageAddr;
  61.  
  62. FROM SysTypes IMPORT PtrBP;
  63.  
  64. IMPORT Lists, Strings;
  65.  
  66.  
  67.  
  68. VAR     handle: ADDRESS;
  69.  
  70. CONST   pathSize = 64;  (* -- Dieser Wert darf verändert werden -- *)
  71.         maxPath = 20;   (* -- Dieser Wert darf verändert werden -- *)
  72.  
  73. VAR     pathArray: ARRAY [1..maxPath] OF ARRAY [0..pathSize] OF CHAR;
  74.  
  75.  
  76. PROCEDURE link (s: ARRAY OF CHAR);
  77.   VAR n: LLRange; ok: BOOLEAN;
  78.   BEGIN
  79.     n:= MIN (LLRange);
  80.     LOOP
  81.       IF n > MAX (LLRange) THEN
  82.         RaiseError (-1, 'Zuviele Linknamen', selfCaused, mayContinue);
  83.         EXIT
  84.       END;
  85.       WITH LinkerParm.linkList [n] DO
  86.         IF NOT valid THEN
  87.           valid:= TRUE;
  88.           Strings.Assign (s, name, ok);
  89.           EXIT
  90.         END;
  91.       END;
  92.       INC (n)
  93.     END
  94.   END link;
  95.  
  96. PROCEDURE setPaths;
  97.   VAR err: BOOLEAN; idx: CARDINAL;
  98.   PROCEDURE set (VAR path: Lists.List; name: ARRAY OF CHAR);
  99.     VAR ok: BOOLEAN;
  100.     BEGIN
  101.       IF Strings.Length (name) >= pathSize THEN
  102.         RaiseError (-1, "'pathSize' erhöhen!", callerCaused, mayContinue)
  103.       ELSE
  104.         IF idx < maxPath THEN
  105.           INC (idx);
  106.           Strings.Assign (name, pathArray [idx], ok);
  107.           Lists.AppendEntry (path, ADR (pathArray[idx]), err)
  108.         ELSE
  109.           RaiseError (-1, "'maxPath' erhöhen!", selfCaused, mayContinue)
  110.         END
  111.       END
  112.     END set;
  113.   BEGIN
  114.     idx:= 0;
  115.     Lists.CreateList (ImpPaths,err);
  116.     Lists.CreateList (ModPaths,err);
  117.  
  118.     (* >>> Hier können die gewünschten Pfade zugewiesen werden <<< *)
  119.     (* Suchpfade für Imp-Module: *)
  120.     set (ImpPaths, '.\');
  121.     set (ImpPaths, 'D:\NEW\CB\IMP\');
  122.     (* Suchpfade für Hauptmodule: *)
  123.     set (ModPaths, '.\');
  124.     set (ModPaths, 'D:\NEW\CB\MOD\');
  125.   END setPaths;
  126.  
  127. VAR bp: PtrBP; ok: BOOLEAN;
  128.  
  129. BEGIN
  130.   setPaths;
  131.   (* >>> Die folgenden Einstellungen können alle verändert werden <<< *)
  132.   link ('M2Init.MOD');
  133.   link ('TOSIO.IMP');
  134.   (*
  135.     link ('GEMIO.IMP');
  136.     link ('GEMDOSIO.IMP');
  137.     link ('GEMError.IMP');
  138.     link ('SimpleError.IMP');
  139.   *)
  140.  
  141.   LinkerParm.maxLinkMod:= 100;         (* Maximal zu linkende Module  *)
  142.   LinkerParm.linkStackSize:= 16384;    (* Standard-Wert: 16384 *)
  143.  
  144.   (*
  145.    * Zuletzt greifen wir noch auf die Command-Line zu,
  146.    * um noch ggf. Optionen nachzutragen:
  147.    *)
  148.   GetBasePageAddr (bp);
  149.   WITH bp^.cmdline DO
  150.     str [ORD(len)]:= 0C;     (* Erstmal Null-Terminieren *)
  151.     (* Wenn keine Optionen angegeben wurden, tragen wir welche ein: *)
  152.     IF (len # 0C) AND (Strings.Pos ("-", str, 0) < 0) THEN
  153.       (* >>> hier können Optionen nachgetragen werden <<< *)
  154.       Strings.Append (" -F", str, ok)  (* vollst. optimieren *)
  155.     END;
  156.     len:= CHR (Strings.Length (str))
  157.   END
  158. END LinkInit.
  159.